/*
    前置知识
    递归相关 : 讲解038
    位运算相关 : 讲解003、030、031、032、033

    解决N皇后问题的时间复杂度是O(n!)，好的方法可以大量剪枝，大量优化常数时间

    用数组表示路径的方法（经典、常数时间慢，不推荐）
    记录之前每一行的皇后放在了什么列
    来到第i行的时候，可以根据0..i-1行皇后的位置，判断能放哪些列
    把能放的列都尝试一遍，每次尝试修改路径数组表示当前的决策，后续返回的答案都累加返回

    用位运算的方法（巧妙、常数时间快，推荐）
    int col   : 0..i-1行皇后放置的位置因为正下方向延伸的原因，哪些列不能再放皇后
    int left  : 0..i-1行皇后放置的位置因为左下方向延伸的原因，哪些列不能再放皇后
    int right : 0..i-1行皇后放置的位置因为右下方向延伸的原因，哪些列不能再放皇后
    根据col、left、right，用位运算快速判断能放哪些列
    把能放的列都尝试一遍，每次尝试修改3个数字表示当前的决策，后续返回的答案都累加返回

*/